﻿package com.jacky.utils 
{
	/**
	 * ArrayUtil 数组处理的工具类
	 * @author jacky
	 */
	public class ArrayUtil
	{
		/**
		 * 打乱数组元素
		 * @param source 将打乱的数组
		 * @return 被打乱元素顺序后的数组
		 */
		public static function shuffle(source:Array):Array {
			if( source == null ) return null;
			return source.sort( function( ...arguments : Array ) : int { return Math.round( Math.random() * 2 ) - 1; } );
		}
		 /**
        * ArrayUtil.takeOut(num:uint, arr:Array) : Array 
		随机从原数组中取出指定个数的元素，并且在原数组中删除它们。从表面上看此函数功能与Random.find函数相同，但是Random.find不修改原数组，效率更高，此方法在需要删除随机选中的元素时使用更为妥当。
        * @param	num
        * @param	arr
        * @return
        */
		public static function takeOut(num : uint,arr : Array) : Array {
            var newArr : Array = new Array(num);
            for (var i : uint = 0;i < num; i++) {
                newArr.push(arr.splice(int(Math.random() * arr.length)), 1);
            }
            return newArr;
        }
		/**
		 * ArrayUtil.find(num:uint, arr:Array) : Array
		随机从原数组中取出指定个数的元素，在新数组中返回。
		 * @param	num
		 * @param	arr
		 * @return
		 */
        public static function find(num : uint, arr : Array) : Array {
            var newArr : Array = arr.concat();
            var cache : *,ti : uint, len : uint = arr.length;
            for (var i : uint = 0;i < num; i++) {
                ti = int(Math.random() * len);
                cache = newArr[i];
                newArr[i] = newArr[ti];
                newArr[ti] = cache;
            }
            return newArr.splice(0, num);
        }
		/**
		 * 判断数组中是否存在某个值
		 * @param	arr 数组
		 * @param	value 值
		 * @return 如果存在返回 true，不存在返回 false
		 */
		public static function isValue(arr:Array, value:Object):Boolean {
			return (arr.indexOf(value) != -1);
		}
		/**
		 * 从数组中删除一个元素
		 * @param	arr 数组
		 * @param	value 值
		 * @return 如果存在返回 true，不存在返回 false
		 */
		public static function removeValue(arr:Array, value:Object):void {
			var len:uint = arr.length;
			if (arr.indexOf(value) == -1) return;
			for (var i:Number = len; i > -1; i--) {
				if (arr[i] === value) {
					arr.splice(i, 1);
				}
			}
		}
		/**
		 * 返回当前数组的副本
		 * @param	arr 数组
		 * @return 数组的副本
		 */
		public static function copyArray(arr:Array):Array {	
			return arr.slice();
		}
		/**
		 * 将一个数组附加在另一个数组之后
		 * 
		 * @param arr	目标数组
		 * @param value	附加的数组
		 * 
		 */
		public function append(arr:Array,value:Array):void
		{
			arr.push.apply(null,value);
		}
		/**
		 * 判断两个数组是否相同
		 * @param	arr1 数组1
		 * @param	arr2 数组2
		 * @return 如果两个数组相同返回 true，如果不相同返回 false
		 */
		public static function arraysAreEqual(arr1:Array, arr2:Array):Boolean {
			if (arr1.length != arr2.length) {
				return false;
			}
			
			var len:Number = arr1.length;
			
			for (var i:Number = 0; i < len; i++) {
				if (arr1[i] !== arr2[i]) {
					return false;
				}
			}
			return true;
		}
		/**
		 * 获得两个数组的共用元素
		 * 
		 * @param array1	对象1
		 * @param array2	对象2
		 * 
		 */
		public static function hasShare(array1:Array,array2:Array):Array
		{
			var result:Array = [];
			for each (var obj:* in array1)
            {
                if (array2.indexOf(obj)!=-1)
                   	result.push(obj);
            }
            return result;
		}
		
		/**
		 * 获得数组中特定标示的对象
		 * 
		 * getMapping([{x:0,y:0},{x:-2,y:4},{x:4,y:2}],"x",-2) //{x:-2:y:4}(x = -2)
		 * getMapping([[1,2],[3,4],[5,6]],0,3) //[3,4](第一个元素为3)
		 *  
		 * @param arr	数组
		 * @param value	值
		 * @param field	键
		 * @return 
		 * 
		 */
		public static function getMapping(arr:Array, value:*, field:* = 0):Object
        {
            for (var i:int = 0;i<arr.length;i++)
            {
            	var o:* = arr[i];
            	
                if (o[field] == value)
                	return o[i];
            }
            return null;
        }
        
        /**
		 * 获得数组中某个键的所有值
		 * 
		 * getFieldValues([{x:0,y:0},{x:-2,y:4},{x:4,y:2}],"x")	//[0,-2,4]
		 *  
		 * @param arr	数组
		 * @param field	键
		 * @return 
		 * 
		 */
		public static function getFieldValues(arr:Array, field:*):Array
        {
        	var result:Array = [];
            for (var i:int = 0;i<arr.length;i++)
            {
            	var o:* = arr[i];
            	
                result.push(o[field]);
            }
            return result;
        }
		public function ArrayUtil() 
		{
			
		}
		
	}

}